home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / INFO / DOSTIPS2.ZIP / DOSKYBRD.TXT < prev    next >
Text File  |  1985-11-24  |  24KB  |  453 lines

  1.                      Overcoming the Keyboard
  2.          (PC Magazine Vol 2 No 1 June 1983 User-to-User)
  3.  
  4.      Here's some handy information for the BASIC programmer.  DOS
  5. keeps track of the NumLock, CapsLock, and ScrollLock key states by
  6. setting and resetting bits in low memory.  A BASIC program may alter
  7. these bits to force entry of uppercase characters from the keyboard,
  8. or to automatically toggle the numeric keypad for either cursor control
  9. or numeric key entry.
  10.      The relevant address is at 0040:0017H, as described on page A-2 of
  11. the Technical Reference manual.  In the program below, lines 20 through
  12. 160 provide ways to test the state of CapsLock, NumLock and ScrollLock,
  13. along with ways to force and exit CapsLock and NumLock.  The state of
  14. the Alt, Ctrl, and the left or right shift keys may also be tested
  15. (lines 170 through 260).
  16.      Another byte at 0040:0018H (see Technical Reference manual, page
  17. A-3) may be tested to see if the Ins, CapsLock, NumLock or ScrollLock
  18. keys are currently being depressed.  Lines 270 to 340 perform these
  19. tests.
  20.      A game program could move a paddle without using the INKEY$
  21. command by applying this method to test the states of the left and
  22. right shifts or any of the other keys mentioned above.  The beauty is
  23. that no keys are queued up into a buffer, so a program can sense
  24. exactly when a key is pressed or released.  
  25.      The here-and-now information that the program gleans from these
  26. memory locations is critical to real-time operations like games and
  27. graphics control.  Setting these bits yourself frees your program's
  28. users from getting dumb instructions like  "Make sure you have pressed
  29. the NumLock Key."
  30.  
  31. 10 DEF SEG=&H40
  32. 20 'Test CapsLock state
  33. 30 IF PEEK(&H17) AND 64 THEN CLOCK=TRUE
  34. 40 'Force CapsLock state
  35. 50 POKE &H17,PEEK(&H17) OR 64
  36. 60 'Exit CapsLock state
  37. 70 POKE &H17, PEEK(&H17) AND 191
  38. 80 'Test NumLock state
  39. 90 IF PEEK(&H17) AND 32 THEN NLOCK=TRUE
  40. 100 'Force NumLock state
  41. 110 POKE &H17,PEEK(&H17) OR 32
  42. 120 'Exit NumLock state
  43. 130 POKE &H17,PEEK(&H17) AND 223
  44. 140 '
  45. 150 'Test ScrollLock state
  46. 160 IF PEEK(&H17) AND 16 THEN SLOCK=TRUE
  47. 170 'Test if Alt Key is depressed
  48. 180 IF PEEK(&H17) AND 8 THEN ALT=TRUE
  49. 190 'Test if Ctrl key is depressed
  50. 200 IF PEEK(&H17) AND 4 THEN CTRL=TRUE
  51. 210 'Test if either shift key is depressed
  52. 220 IF PEEK(&H17) AND 3 THEN SHFT=TRUE
  53. 230 'Test if left shift key is depressed
  54. 240 IF PEEK(&H17) AND 2 THEN LS=TRUE
  55. 250 'Test if right shift key is depressed
  56. 260 IF PEEK(&H17) AND 1 THEN RS=TRUE
  57. 270 'Test if Ins key is depressed
  58. 280 IF PEEK(&H18) AND 128 THEN INS=TRUE
  59. 290 'Test if CapsLock is depressed
  60. 300 IF PEEK(&H18) AND 64 THEN CL=TRUE
  61. 310 'Test if NumLock is depressed
  62. 320 IF PEEK(&H18) AND 32 THEN NL=TRUE
  63. 330 'Test if ScrollLock is depressed
  64. 340 IF PEEK(&H18) AND 16 THEN SL=TRUE
  65.  
  66. -----------------------------------------------------------------
  67.                          Keyboard Codes
  68.          (PC Magazine Vol 4 No 1 Jan 8, 1985 by P. Abel)
  69.  
  70.      Each key on the PC keyboard has a designated physical position,
  71. number from 1 (Esc) through 83 (Del).  When a key is pressed it
  72. generates a scan code, which is the same as its position number, though
  73. it is expressed in hex notation.  Thus, pressing the Esc key produces
  74. 01H; Del generates scan code 53H.  (A second set of scan codes -- made
  75. by adding 80H to the first -- is generated when the key is released,
  76. but the PC does not seem to use these latter codes.)  Any program can
  77. determine the source of any keystroke by using the scan codes.  When
  78. you press the A key, the computer actually gets two pieces of
  79. information: the scan code for the letter A (1EH) and, of course, the
  80. ASCII character code for A (41H).  The table below shows the scan codes
  81. for some common extended functions.
  82.      A simple request for input of one character from the keyboard
  83. involves setting the AH register to zero and requesting DOS interrupt
  84. 16H:
  85.           SUB   AH,AH     ;or MOV AH,00
  86.           INT   16H       ;request keyboard input
  87. The operation responds in one of two ways, depending on whether you
  88. pressed a character code or an extended function code.
  89.      Suppose that a key you pressed represents a displayable character,
  90. such as a letter (A through Z), a number (0 through 9) or a symbol such
  91. as !, @, #, or $.  The INT operation delivers the ASCII character code
  92. to the AL register and the scan code to the AH register.  Thus,
  93. pressing the letter A puts character code 41H in the AL register and
  94. also places 1EH in the AH register.
  95.      For most purposes, the character code in the AL register is the
  96. only information your computer needs.  Suppose, however, that the key
  97. you press represents an extended function code, such as one of the ten
  98. function keys or a cursor arrow key.  For these noncharacter requests,
  99. the operation sets the AL register to zero and inserts the scan code
  100. in the AH register.
  101.      Consequently, when an INT 16H instruction is used to request a
  102. keyboard entry, the program can then test the AL register.  If it is
  103. nonzero, the request is for an extended function code.
  104.      The following instructions test if an INT 16H operation has 
  105. returned a zero value to the AL register:
  106.           SUB   AH,AH
  107.           INT   16H       ;request input
  108.           CMP   AL,00     ;extended function code?
  109.           JZ    exit1     ;yes -- exit to routine
  110.      You probably have noticed that certain characters, such as +, -,
  111. and *, appear twice on the keyboard.  To the PC, each of these
  112. similarly labeled keys is quite different.  The plus symbol puts the
  113. character code 2BH in the AL register and one of two scan codes in the
  114. AH register.  If the plus key pressed was in the top row above the
  115. equals sign, the scan code is 0DH.  If the plus key pressed was at the
  116. far right, the scan code is 4EH.
  117.      In the following routine, if the character is a plus sign (2BH),
  118. the logic tests for the scan code:
  119.           CMP   AL,2BH     ;plus sign?
  120.           JNE   exit2      ;no -- exit
  121.           CMP   AH,4EH     ;which scan code?
  122.           JE    exit3
  123.      Following is a simple example that sets the cursor to row 0, 
  124. column 0, if you press the Home key (scan code 47H).  Interrupt 10H,
  125. for setting the cursor, requires 02 in the AH register, zero in BH,
  126. the row in DH, and the column DL:
  127.           SUB   AH,AH     ;clear AH
  128.           INT   16H       ;request input
  129.           CMP   AL,00     ;extended function?
  130.           JNE   exit4     ;no -- exit
  131.           CMP   AH,47H    ;scan code is Home?
  132.           JNE   exit5     ;no -- exit
  133.           MOV   DX,00     ;set row/col to zero
  134.           MOV   AH,02     ;set AH to 02
  135.           SUB   BH,BH     ;set BH to zero
  136.           INT   10H       ;set cursor
  137.      A program can respond to a scan code in many different ways.  The
  138. example above interprets the Home key to mean that the cursor is to be
  139. set at row 0, column 0.  But a program can respond with any other
  140. action or can even ignore the keystroke entirely.
  141.      A program could make further tests for scan codes.  The function
  142. keys deliver scan codes 3BH through 44H, respectively.  Following is a
  143. test for function key F1:
  144.           CMP   AH,3BH    ;function key F1?
  145.           JE    exit6     ;yes, exit
  146.      Here again, a program could perform any designated action for a
  147. user request.
  148.      Suppose that a program stores the current row/column setting for
  149. the cursor in fields named ROW and COL, respectively.  You press the
  150. down arrow to request moving the cursor down one row.  The following
  151. program segment moves the cursor, provided that ROW is not already at
  152. 24, to the bottom of the screen:
  153.           SUB   AH,AH
  154.           INT   16H       ;request input
  155.           CMP   AL,00     ;extended function?
  156.           JNE   exit1     ;no -- exit 
  157.           CMP   AH,50H    ;down cursor? 
  158.           JNE   exit2     ;no -- exit
  159.           CMP   ROW,24    ;bottom of screen?
  160.           JAE   exit3     ;yes -- exit
  161.           INC   ROW       ;increment ROW by 1
  162.           MOV   AH,02
  163.           SUB   BH,BH
  164.           MOV   DH,ROW
  165.           MOV   DL,COL
  166.           INT   10H       ;set cursor to 00,00
  167.      Since it is the program that interprets the scan codes, you could
  168. intentionally or erroneously cause the down cursor key to perform any
  169. other action, even to move up the screen!
  170.      For further reference, the complete technical details for all scan
  171. codes as well as the use of the Shift, Ctrl and Alt keys are available
  172. in the IBM PC Technical Reference manual, in the Keyboard Encoding and
  173. Usage section.  The character codes are listed in Appendix C.
  174.      To see how this works, you can type in the short assembly
  175. language program below, using the A (Assemble) command of the DEBUG
  176. mini-Assembler.  When you use the A command in DEBUG, the code will
  177. automatically begin at 100H.  After the last line, just press Enter a
  178. second time to exit from the assembler.  The source program is very
  179. short and consists of just three instructions:
  180.           SUB   AH,AH
  181.           INT   16H
  182.           JMP   100H 
  183.      The INT 16H instruction requests input from the keyboard.  After
  184. you enter a character, the JMP instruction returns you to the beginning
  185. creating an endless loop.  Normally, you would scrupulously avoid this
  186. practice; however, DEBUG provides a simple way out of the program.
  187.      To enter the program directly in machine language, insert your DOS
  188. disk in drive A: and boot up in the usual way.  When the DOS A> prompt
  189. appears, type DEBUG and hit Enter.  When the DEBUG hyphen prompt
  190. appears, use DEBUG's E command to enter the three instructions in hex
  191. machine language.  Type these instructions exactly as they appear,
  192. including the blanks.  Hit the Enter key at the end of each line.
  193.           E CS:100 28 E4
  194.           E CS:102 CD 16
  195.           E CS:104 EB FA
  196.      The CS stands for Code Segment, the area for executable code.  The
  197. values 100, 102 and 104 are the relative locations within the CS where
  198. each of the three two-byte instructions begin.  The normal starting
  199. location of the first instruction in the Code Segment is 100H.
  200.      The values 28 E4, CD 16 and EB FA are the actual machine code for
  201. each of the three assembly language instructions.  Before attempting to
  202. execute this program, make sure that you have keyed each entry exactly
  203. as shown (you can repeat any line that contains an error).  On
  204. completion, type R and Enter to display the starting instruction.  The
  205. operation displays the contents of the registers in hex and the first
  206. instruction:
  207.           3B33:0100 28 E4   SUB AH,AH
  208. The first four hex digits, 3B33 (which is actually 3B330), indicate the
  209. address of the beginning of the Code Segment, but your version will
  210. probably differ from this value.  The rest of the line should be
  211. identical, however.
  212.      You should now press T and then Enter to trace execution of the
  213. next instruction.  The screen should display:
  214.           3B33:0102 CD 16    INT 16
  215. The computer is now about to execute the interrupt instruction.  If you
  216. wanted, you could trace the operation through the entire BIOS routine,
  217. but for this exercise, it's as well to execute right through the INT
  218. operation and stop at the JMP instruction that follows at 104.  To do
  219. this, type G 104 and Enter.
  220.      The program should stop with the cursor blinking, waiting for the
  221. keyboard input that INT 16H has requested.  Type a lowercase a.  The
  222. program should accept this character and immediately display the
  223. registers and the next instruction.  Your interest is only in the
  224. contents of the AX register, which should be 1E61.  1EH in the AH
  225. register represents the scan code for keyboard position 30 (the letter
  226. a), and 61H in register AL represents the ASCII code for a.
  227.      The instruction that displays should be:
  228.           08FD:0104  EBFA     JMP 0100
  229. Press T and Enter to execute the JMP instruction, and enter G 104 
  230. again to execute the interrupt.  This time, type an uppercase A.  
  231. The AX register will now contain 1E41.
  232.      You can continued indefinitely by repeatedly using T and G 104.
  233. Try entering a variety of keyboard entries, such as Esc, Ins, Del, F1,
  234. Home, cursor keys, both plus signs, both minus signs and numbers.  A
  235. few keys, such as Shift by itself, do not cause the keyboard to produce
  236. a code.
  237.      When you've had enough scan codes for one session, you can exit
  238. from DEBUG by typing Q (for Quit) instead of T or G 104.
  239.  
  240. Selected keys and their hex scan codes.
  241.   Extended Function        Hex Scan Code
  242.   Alt/A - Alt/Z                 1E - 2C
  243.   F1 - F10                      3B - 44
  244.   Home                               47
  245.   Up arrow                           48
  246.   PgUp                               49
  247.   Left arrow                         4B
  248.   Right arrow                        4D
  249.   End                                4F
  250.   Down arrow                         50
  251.   PgDn                               51
  252.   Ins                                52
  253.   Del                                53
  254.  
  255. -----------------------------------------------------------------
  256.                        AT Keyboard Tricks
  257.       (PC Magazine Vol 4 No 19 Sept 17, 1985 User-to-User)
  258.  
  259.      The AT keyboard is programmable.  For instance, it's simple to
  260. change the keyboard's LED shift-lock indicators.  First issue an
  261. OUT &H60,&HED (the SET/RESET LEDs command), and follow this immediately
  262. with an OUT &H60,nn(where nn is a binary value indicating which LEDs to
  263. turn on).  Bit 0 is for the ScrollLock indicator, bit 1 is for NumLock,
  264. and bit 2 is for CapsLock.  The LEDCYCLE.BAS program cycles the AT's
  265. LEDs through a binary counting sequence.
  266.      However, turning an LED on or off does not change the ScrollLock,
  267. NumLock or CapsLock keyboard shift states.  These actual shift states
  268. are controlled by bits 4, 5 and 6 of the BIOS KB_FLAG at address
  269. 0040:0017.  To illustrate this, the TOGGLE.BAS program turns on the
  270. NumLock LED and sets the NumLock state.
  271.      But the most significant new feature of the AT keyboard is that
  272. its typematic action is programmable.  You can specify the amount of
  273. time to wait before sending the first repeat (the delay) and the time
  274. between repeats (the rate).  First, output a command (&HF3), then
  275. output a delay-and-rate value.  Bits 5 and 6 control the delay,
  276. ranging from 250 ms up to 1 second.  The lowest 5 bits (bits 0 through
  277. 4) identify the repeat rate, ranging from about 30 repeats per second
  278. to 2 repeats to second.  The following two commands set the keyboard
  279. to perform with a 1/4-second delay and 20 repeats per second:
  280.           OUT &H60,&HF3:OUT &H60,4
  281.      Be sure to enter both commands on the same line.  After receiving
  282. the &HF3 command, the keyboard locks up until it receives the rate and
  283. delay byte.  You can use the KEYRATE.BAS program to set the keyboard
  284. typematic parameters.  It includes the logic to display the exact delay
  285. and rate you select, calculated with formulats from the AT Technical
  286. Reference Manual.  The default power-on settings are a 1/2-second delay
  287. and a repeat rate of 10 per second.  A better choice of settings is a
  288. 1/4-second delay and 15 to 20 repeats per second.  It is possible to
  289. set the keyboard to output up to 30 repeats per second.
  290.  
  291. LEDCYCLE.BAS:
  292. 110 DEF SEG=&HFFFF:IF PEEK(14)=252 THEN 130
  293. 120 PRINT "Try this on an AT only!":END
  294. 130 FOR J=0 TO 7
  295. 140 OUT &h60,&hed:OUT &h60,J
  296. 150 FOR DELAY=1 TO 1000:NEXT
  297. 160 IF INKEY$ > "" THEN STOP
  298. 170 NEXT
  299. 180 GOTO 130
  300.  
  301. TOGGLE.BAS:
  302. 110 DEF SEG=&HFFFF:IF PEEK(14)=252 THEN 130
  303. 120 PRINT "Try this on an AT only!":END
  304. 130 NUM.LED=4:NUM.FLG=&H10
  305. 140 CPS.LED=2:CPS.FLG=&H20
  306. 150 SCR.LED=1:SCR.FLG=&H40
  307. 160 DEF SEG=&H40
  308. 170 POKE &H17,PEEK(&H17) OR NUM.FLG
  309. 180 OUT &H60,&HED:OUT &H60,NUM.LED
  310.  
  311. KEYRATE.BAS:
  312. 110 DEF SEG=&HFFFF:IF PEEK(14)=252 THEN 130
  313. 120 PRINT "Try this on an AT only!":END
  314. 130 PRINT "=low values are fastest="
  315. 140 INPUT "initial delay (0-3): ",ID
  316. 150 INPUT "repeat rate (0-31):  ",RR
  317. 160 OUT &H60,&HF3:OUT &H60,(ID*32) OR RR
  318. 170 PRINT "initial delay is";
  319. 180 PRINT (ID+1)*.25;"seconds"
  320. 190 A=(RR AND 7):B=(RR AND 24)\8
  321. 200 P=(8+A)*(2^B)*.00417
  322. 210 PRINT "repeat rate is";
  323. 220 PRINT 1/P;"per second"
  324.  
  325. -----------------------------------------------------------------
  326.                      Free Graphics Keyboard
  327.       (PC Magazine Vol 4 No 19 Sept 17, 1985 User-to-User)
  328.  
  329.      DOS 3.x includes five programs on the main DOS disk that you can
  330. adapt to create a totally customized keyboard.  The KEYBxx.COM programs
  331. let you turn your IBM/American keyboard into one more suitable for use
  332. in the UK, Germany, France, Italy or Spain by switching some of the
  333. letters and punctuation marks around and substituting things like pound
  334. signs for dollar signs.
  335.      To create a custom keyboard, copy one of these five programs onto
  336. a work disk, and give a name like KEYCUST.COM.  The go into DEBUG and
  337. make the changes.  Search through the file until you see the familiar
  338. "asdf ..." and "ASDF ..." characters at the right side of your screen,
  339. and then replace the existing letters with the ones you want.  For
  340. instance, to customize the KEYBUK.COM so that hitting the leftmost nine
  341. keys --- "qwe" on one line, then "asd" on the second line, and then
  342. "zxc" on the third line -- produces a box, type:
  343.           COPY A:KEYBUK.COM B:KEYCUST.COM
  344. and then
  345.           DEBUG KEYCUST.COM
  346. When you see the DEBUG prompt, type:
  347.           e 592 da c2 bf
  348.           e 5a0 c3 c5 b4
  349.           e 5ae c0 c1 d9
  350.           w
  351.           q
  352. Then load the new keyboard program by typing KEYCUST.
  353.      You can toggle back and forth between your normal keyboard and the
  354. customized one.  Hit Ctrl-Alt-F1 for you normal keyboard or Ctrl-Alt-F2
  355. for your new one.  By following these procedures, you can create all
  356. sorts of alternate keyboard layouts -- one with graphics symbols, one
  357. with math symbols, etc., and load them whenever you need them.
  358.  
  359. -----------------------------------------------------------------
  360.                        DOS Keyboard Macros
  361.        (PC Magazine Vol 4 No 26 Dec 24, 1985 User-to-User)
  362.  
  363.     Would you like to log into drive C:, change the active subdirectory
  364. and then execute a program like 1-2-3, all with one keystroke?  The
  365. NEWKEYBD.BAS program creates a file called NEWDOS.KBD that sets this up
  366. for you automatically.  In addition, you can read the directory of your
  367. logged drive by hitting Alt-D and load a print spool buffer by hitting
  368. Alt-B.  And you can do much more, all without having to purchase any
  369. memory-draining commercial keyboard macro programs such as SuperKey.
  370.      Lines 110 to 180 read the DATA at the end of the program and write
  371. it to the NEWDOS.KBD file.  To create your own macros, just change the
  372. DATA statements following line 180.  The structure of the DATA fields
  373. at the end of NEWKEYBD.BAS is as follows:
  374.      1. The first field specifies the total number of commands you want
  375. to assign to a single key.
  376.      2. The second field is the number of the key you want to redefine
  377. (see the table below).
  378.      3. The third field is the exact text of the command that you would
  379. have ordinarily had to type manually.  Each must be inside quotation
  380. marks, and each must be separated by a comma.
  381.      4. After you're all done, the very last line of DATA must be just
  382. a zero (0).
  383.      Once you've entered your customized DATA statements, run
  384. NEWKEYBD.BAS to create your copy of NEWDOS.KBD.  Then, to execute
  385. your redefinitions, get into DOS and type:  COPY NEWDOS.KBD CON:
  386. You can put this command in an AUTOEXEC.BAT file to load the keyboard
  387. redefinitions automatically.  For this to work properly, you have to
  388. have booted your system with a CONFIG.SYS on your disk that includes
  389. the line DEVICE=ANSI.SYS.  And, of course, ANSI.SYS has to be on your
  390. disk as well.
  391.      Editor's Note:  The table that follows are the extended ASCII
  392. codes for every shifted key on the keyboard.  (Actually, they are all
  393. preceded by a 0, but NEWKEYBD.BAS takes care of this automatically in
  394. line 140.)  You could also reassign the normal, nonshifted keys by
  395. removing the 0 and the semicolon in line 140 and creating the
  396. appropriate DATA statement.  For instance, if you never use the grave
  397. accent (the backward apostrophe key), you could change the NEWKEYBD.BAS
  398. program to make this key give you a directory listing by removing the
  399. 0; from line 140 and creating the DATA line:  190  DATA 1,96, "DIR"
  400. since 96 is the decimal ASCII code for the grave accent.  If you try
  401. this, remember not to mix shifted keys (which need the 0;) with
  402. nonshifted keys (which don't need the 0;).  And whether you are
  403. redefining just one key or several, DATA 0 must be the last line in
  404. the program.
  405.      Remember also that this won't work unless you type the line
  406. COPY NEWDOS.KBD CON: while in DOS.  You can keep several different
  407. files of reassigned keys under different names, but you have to COPY
  408. each to CON: when you want to use it.
  409.      Finally, if you create your own NEWDOS.KBD file, remember that
  410. you had to have already loaded ANSI.SYS by including DEVICE=ANSI.SYS
  411. in your CONFIG.SYS file in the root directory of your boot disk, which
  412. means you may have to adjust your CONFIG.SYS file and reboot for your
  413. keys to be redefined.
  414.  
  415. 100 'NEWKEYBD.BAS
  416. 110 OPEN "O", #1, "NEWDOS.KBD"
  417. 120 READ HOWMANY:IF HOWMANY=0 THEN CLOSE:END
  418. 130 READ KEYNUMBR:KEYNO$=MID$(STR$(KEYNUMBR),2)
  419. 140 PRINT #1,CHR$(27)"[0;"KEYNO$";"CHR$(34);
  420. 150 FOR I=1 TO HOWMANY:READ TEXT$
  421. 160 PRINT #1,TEXT$;CHR$(13);
  422. 170 NEXT
  423. 180 PRINT #1,CHR$(34)"p":GOTO 120
  424. 190 DATA 3,60,"C:","CD\LOTUS","123"
  425. 200 DATA 1,32,"DIR"
  426. 210 DATA 1,48,"PRINTSPL -LPT1 -BUF32"
  427. 220 DATA 0
  428.  
  429.                   Table of Extended ASCII Codes
  430.  
  431. F1     59   Alt-F1  104   Shift-F1  84   Ctrl-F1   94   Alt-1      120
  432. F2     60   Alt-F2  105   Shift-F2  85   Ctrl-F2   95   Alt-2      121
  433. F3     61   Alt-F3  106   Shift-F3  86   Ctrl-F3   96   Alt-3      122
  434. F4     62   Alt-F4  107   Shift-F4  87   Ctrl-F4   97   Alt-4      123
  435. F5     63   Alt-F5  108   Shift-F5  88   Ctrl-F5   98   Alt-5      124
  436. F6     64   Alt-F6  109   Shift-F6  89   Ctrl-F6   99   Alt-6      125
  437. F7     65   Alt-F7  110   Shift-F7  90   Ctrl-F7  100   Alt-7      126
  438. F8     66   Alt-F8  111   Shift-F8  91   Ctrl-F8  101   Alt-8      127
  439. F9     67   Alt-F9  112   Shift-F9  92   Ctrl-F9  102   Alt-9      128
  440. F10    68   Alt-F10 113   Shift-F10 93   Ctrl-F10 103   Alt-10     129
  441.  
  442. Alt-A  30   Alt-H    35   Alt-O     24   Alt-V     47   Ctrl-PrtSc 114
  443. Alt-B  48   Alt-I    23   Alt-P     25   Alt-W     17   Ctrl-Left  115
  444. Alt-C  46   Alt-J    36   Alt-Q     16   Alt-X     45   Ctrl-Right 116
  445. Alt-D  32   Alt-K    37   Alt-R     19   Alt-Y     21   Ctrl-End   117
  446. Alt-E  18   Alt-L    38   Alt-S     31   Alt-Z     44   Ctrl-PgDn  118
  447. Alt-F  33   Alt-M    50   Alt-T     20   Alt--    130   Ctrl-Home  119
  448. Alt-G  34   Alt-N    49   Alt-U     22   Alt-+    131   Ctrl-PgUp  132
  449.  
  450. Home   71   Up       72   PgUp      73   Left      75   Right       77
  451. End    79   Down     80   PgDn      81   Ins       82   Del         83
  452.                                                         Shift-Tab   15
  453.